

#ifndef TRENDCHART_CTRENDCHART_H
#define TRENDCHART_CTRENDCHART_H

#include <QtCore>
#include <QtWidgets>
#include "CTrendDefine.h"
#include "qcustomplot.h"

class CTrendChart
        : public QWidget
{
    Q_OBJECT
public:
    enum PosType
    {
        PosLeft,    //左侧坐标轴
        PosRight    //右侧坐标轴
    };
public:

    explicit CTrendChart(QWidget *widget = nullptr);

    /**
     * @brief 对指定name的graph设置颜色
     * @param name graph的名称
     * @param color 颜色
     */
    void SetGraphColor(const QString &name, const QColor &color);

    /**
     * @brief 设置所有graph的颜色
     * @param color
     */
    void SetColor(const QMap<QString, QColor> &color);

    /**
     * @brief 添加指定名称的graph到指定坐标轴
     * @param name graph的名称
     * @param pos 左侧或右侧坐标轴
     */
    void AddGraph(const QString &name, PosType pos = PosLeft);

    /**
     * @brief 添加指定名称的graph，并指定x轴数据key，y轴数据value，以及对应y轴
     * @param name graph的名称
     * @param key x轴数据
     * @param value y轴数据
     * @param pos 左侧或右侧坐标轴
     */
    void AddGraph(const QString &name, const QVector<double> &key, const QVector<double> &value, PosType pos = PosLeft);

    /**
     * @brief 清除指定名称的graph，为空时清除所有graph
     * @param name graph的名称
     */
    void ClearGraph(const QString &name = "");

    /**
     * @brief 设置图是否显示
     * @param name
     * @param visible
     */
    void SetGraphVisible(const QString &name, bool visible);

    /**
     * @brief 添加指定为位置value，指定颜色color，指定方向oriention，指定y轴的基线
     * @param value 值
     * @param color 颜色
     * @param orientation 水平或垂直
     * @param pos 左侧或右侧坐标轴
     * @param intersect TODO
     * @return 基线对应的名称，全局唯一
     */
    QString AddLine(double value = 0, const QColor &color = Qt::black, Qt::Orientation orientation = Qt::Vertical,CTrendChart::PosType pos = PosLeft, bool intersect = false);

    /**
     * @brief 更新指定名称的基线值
     * @param name 基线名称
     * @param value 值
     */
    void UpdateLinePos(const QString &name, double value);

    /**
     * @brief 设置基线是否显示
     * @param name 基线名称
     * @param visible
     */
    void SetLineVisible(const QString &name, bool visible);

    /**
     * @brief 清除指定名称的基线，为空时清除所有基线
     * @param name
     */
    void RemoveLine(const QString &name = "");

    /**
     * @brief 为指定名称的graph设置x轴数据key，y轴数据value，
     * @param name
     * @param key
     * @param value
     */
    void SetData(const QString &name, const QVector<double> &key, const QVector<double> &value);

    /**
     * @brief 重新设置趋势数据
     * @param dataSet [<0，<"Pplat"，34>>,<0，<"Pplat"，34>>,...]
     */
    void SetData(const TrendDataList & dataSet);

    /**
     * @brief 追加数据
     * @param key x轴值
     * @param name graph的名称
     * @param value y轴值
     */
    void AppendData(double key, const QString &name, double value);

    /**
     * @brief 追加数据
     * @param key x轴值
     * @param values 多个graph对应的值
     */
    void AppendData(double key, const QMap<QString, double> &values);

    /**
     * @brief 设置x轴时间范围
     * @param start 起始时间
     * @param size_s 起始时间后时间长度 单位：s
     */
    void SetXRangeStart(double start, double size_s);

    /**
     * @brief 设置X轴e时间范围
     * @param end 结束时间
     * @param size_s 结束时间前的长度 单位：s
     */
    void SetXRangeEnd(double end, double size_s);

    /**
     * @brief 设置X轴标签
     * @param label
     */
    void SetXLabel(const QString &label);

    /**
     * @brief 设置Y轴范围
     * @param min1 左侧Y轴最小值
     * @param max1 左侧Y轴最大值
     * @param min2 右侧Y轴最小值
     * @param max2 右侧Y轴最小值
     */
    void SetYRange(double min1, double max1, double min2 = .0, double max2 = .0);

    /**
     * @brief 设置Y轴标签
     * @param label1 左侧Y轴标签
     * @param label2 右侧Y轴标签
     */
    void SetYLabel(const QString &label1, const QString &label2 = "");

    /**
     * @brief 重绘
     */
    void Update();

    void AdjustAxis();
signals:
    void PlotFinished();

private:
    void InitUi();

    void InitEvent();

    void InitWidget();

    void InitState();

    void AddLegend(const QString &name);

    void DelLegend(const QString &name);

    void SetLegendColor(const QString &name,const QColor & color);

    void AddTracer(const QString &name,double key);

    void ClearTracer(const QString &name = "");

    void SwitchSelectState();
private:
    struct LineProperty
    {
        QString name = "";
        double value = 0;
        QColor color = Qt::black;
        Qt::Orientation orientation = Qt::Vertical;
        CTrendChart::PosType pos = PosLeft;
        bool intersect = false;
    };

    QCustomPlot *plot = nullptr;
    QMap<QString, QCPGraph *> all_graph;
    QMap<QString, QColor> all_color;
    QMap<QString, QToolButton *> all_legend;
    QMap<QString, QPair<QCPItemStraightLine *, LineProperty*>> all_line;
    QMap<QString, QCPItemTracer *> all_tracer;
    bool enableMultiGroup = true;
    QHBoxLayout *legend_box = nullptr;
    QLabel *select_all_label = nullptr;
    QCheckBox *select_all = nullptr;
    QCPItemText * text_item = nullptr;
    QSharedPointer<QCPAxisTickerTime> timeTicker = nullptr;
    QString cursor_line;
    int xTickCount = 5;
    int interval = 0;

    bool isPlot = false;
};


#endif //TRENDCHART_CTRENDCHART_H
